<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>07 - 函数</title>
</head>
<body>
    <script>
        
        // 函数





        // A. 基本函数      (具名函数: 函数有具体的名字)
        // ☛ 语法: 
        //        function 自定义函数名(形参) {
        //            自己的逻辑代码
        //        }
        //        自定义函数名(实参);





        // B. 匿名函数      函数没有名字
        // ☛ 语法:  function() {}
        // ☛ 语法:  
        //       let 变量名 = function() {}
        //       变量名();





        // C. 高阶函数      以函数体作为参数 / 返回值是一个函数体 
        function fn(a) {
            console.log(a);
        }
        fn(fn1);
        // fn1 就是一个实参, 实参也是一个函数, 形参 a 当前 fn1 这个函数
        // 现在 fn 就叫高阶函数





        // D. 回调函数      在高阶函数中, 作为参数使用的函数就是回调函数
        hd(function(){});
        // hd 是高阶函数, function(){} 就是回调函数





        // E. 延迟函数
        // ☛ 语法:  
        //       setTimeout(function(){}, 延迟时间);
        // 停止延迟函数
        setTimeout();





        // F. 自调函数 (自执行函数)     本质上就是函数调用的一种方式
        // ☛ 语法:  
        //       (函数体)();
        // 注意: 自调用函数(自执行函数)最后必须写分号结束





        // G. 递归函数      在函数中调用函数自己 (自己调用自己)
        function fn() {     
            fn();           // 默认就是死循环 (无限的执行)
            // return 停止递归函数死循环
        }
        fn();
        // fn() 这个函数就叫递归函数





        // H. 闭包函数      如果在一个函数中, 另外一个函数使用了当前函数中的变量, 那么整体函数就叫闭包函数
        function fn() {
            let a = 123;
            function fn1() {
                console.log(a);
            }
            fn1();
        }
        fn();
        // fn 就是闭包函数





        // I. 定时器
        // ☛ 语法:  
        //        setInterval(function() {
        //            逻辑代码;
        //        }, 时间间隔); 
        // 停止定时器     
        setInterval();       
        




        // J. 方法(函数)
        let obj = {
            eat: function(){}
        }





        // K. 箭头函数      就是函数的另外一种新写法
        // ☛ 语法:  
        //        () => {}



    </script>
</body>
</html>


<script>

    // 函数提升     任何函数都会提升

</script>


<script>

    // 函数形参默认值 (是形参的默认值)
    // ☛ 语法:  
    //        function 函数名(形参 = 值, 形参 = 值) {}

</script>


<script>

    // 1. 动态参数      函数的形参个数不确定,但是依然能够获取实参的值

    // 2. 剩余参数      剩余参数本质就是动态参数的另外一种写法
    // ☛ 语法:  
    //        函数(...参数名) {}

</script>